// common/api/auth_api.dart
import 'package:get/get.dart';
import '../services/network/index.dart';
import '../models/auth/login_request.dart';
import '../models/auth/token_model.dart';
import '../models/common/api_response.dart';

/// 认证API - 纯粹的HTTP请求层
/// 基于hello-auth-api.md实现
class AuthApi {
  static final ApiService _apiService = Get.find<ApiService>();
  
  /// 用户登录API
  /// 
  /// 请求参数：
  /// - username: 用户名（长度：2-20）
  /// - password: 密码（长度：5-20）
  /// 
  /// 响应数据：
  /// - access_token: 访问令牌
  /// - refresh_token: 刷新令牌
  /// - expires_in: 访问令牌过期时间（分钟）
  /// - refresh_expires_in: 刷新令牌过期时间（分钟）
  static Future<ApiResponse<TokenModel>> login(LoginRequest request) async {
    return await _apiService.post<TokenModel>(
      '/auth/login',
      data: request.toJson(),
      fromJson: (data) => TokenModel.fromJson(data),
      tag: 'auth_login',
    );
  }
  
  /// 用户注册API
  /// 
  /// 请求参数：
  /// - username: 用户名（长度：2-20）
  /// - password: 密码（长度：5-20）
  /// - confirmPassword: 确认密码
  static Future<ApiResponse<Map<String, dynamic>>> register({
    required String username,
    required String password,
    required String confirmPassword,
  }) async {
    return await _apiService.post<Map<String, dynamic>>(
      '/auth/register',
      data: {
        'username': username,
        'password': password,
        'confirmPassword': confirmPassword,
      },
      fromJson: (data) => data as Map<String, dynamic>,
      tag: 'auth_register',
    );
  }
  
  /// 刷新令牌API
  /// 
  /// 请求参数：
  /// - refreshToken: 刷新令牌
  /// 
  /// 响应数据：
  /// - access_token: 新的访问令牌
  /// - refresh_token: 新的刷新令牌
  /// - expires_in: 访问令牌过期时间（分钟）
  /// - refresh_expires_in: 刷新令牌过期时间（分钟）
  static Future<ApiResponse<TokenModel>> refreshToken({
    required String refreshToken,
  }) async {
    return await _apiService.post<TokenModel>(
      '/auth/refresh',
      data: {
        'refreshToken': refreshToken,
      },
      fromJson: (data) => TokenModel.fromJson(data),
      tag: 'auth_refresh',
    );
  }
  
  /// 用户退出登录API
  /// 
  /// 需要在请求头中包含Authorization: Bearer <token>
  /// 成功退出后会清除服务器端的令牌信息
  static Future<ApiResponse<bool>> logout() async {
    return await _apiService.delete<bool>(
      '/auth/logout',
      fromJson: (data) => true, // 成功返回true
      tag: 'auth_logout',
    );
  }
  
  /// 检查令牌是否有效API
  /// 辅助方法，用于验证当前令牌状态
  static Future<ApiResponse<bool>> validateToken() async {
    return await _apiService.get<bool>(
      '/auth/validate',
      fromJson: (data) => data == true || data == 'valid',
      tag: 'auth_validate',
    );
  }
}